package com.bzg.autowire.genericType;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 重点：因为ResolvableType的功能太复杂，所以先不看他的源码，这里对泛型的注入做一下总结
 * 1、本类自己作为一个bean进行创建时，泛型怎么办？
 * 2、他的子类作为一个bean时，父类中的泛型怎么办？
 * */
//@Component
public class ExService<O,S> {

	/**
	 * 1、如果本类作为bean时，在对该字段注入时，会报错（无论是基于@Bean还是直接Component）
	 * 该字段的注入肯定会进入
	 * @see org.springframework.beans.factory.support.DefaultListableBeanFactory#resolveMultipleBeans
	 * 的else if (Collection.class.isAssignableFrom(type) && type.isInterface()) {分支中
	 * 但这里面在拿到泛型时 Class<?> elementType = descriptor.getResolvableType().asCollection().resolveGeneric();
	 * 返回的本不会是Object，也就是List<O>中的这个O并没有被认作为Object,而是返回一个elementType -> null,这就导致会跳出resolveMultipleBeans
	 * 方法，使得spring将List作为一个类型，然后去容器中找List类型的bean。找不到自然就报错,同时还不能找到多个List类型的bean，否则spring又会先校验
	 * 他是否为集合类型，判断出是集合类型那有将会报错(因为此时只能筛选一个bean，正常来说集合类型在resolveMultipleBeans方法中就应该返回了)
	 * 2、如果是子类作为bean来注入：
	 * 该字段泛型O将会是子类指定的类型
	 * */
	@Autowired
	public List<O> oList;

	/**
	 * 基于本类bean注入：O将会是Object类型，不会是null
	 * 基于子类则为子类指定的类型
	 * */
	@Autowired
	public O o;

	@Autowired
	private S s;

}
